﻿using System;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOPresupuestosClientes
    /// </summary>
    class DAOIMPLPresupuestosClientes:Presupuesto_DAO.DAOPresupuestosClientes
    {
        /// <summary>
        /// Guarda un presupuesto asociado a un cliente
        /// </summary>
        /// <param name="idPresupuesto">Determina el presupuesto</param>
        /// <param name="idCliente">Determina el cliente</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool savePresupuestoCliente(int idPresupuesto, int idCliente)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO presupuestos_clientes(id_presupuesto, id_cliente) VALUES(@idPresupuesto, @idCliente)";
                insertar.Parameters.AddWithValue("@idPresupuesto", idPresupuesto);
                insertar.Parameters.AddWithValue("@idCliente", idCliente);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un presupuesto asociado a un cliente
        /// </summary>
        /// <param name="idPresupuesto">Determina el presupuesto</param>
        /// <param name="idCliente">Determina el cliente</param>
        /// <param name="id">Determina la relación a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updatePresupuestoCliente(int idPresupuesto, int idCliente, int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE presupuestos_clientes SET id_presupuesto = @idPresupuesto, id_cliente = @idCliente WHERE id = @id";
                modificar.Parameters.AddWithValue("@idPresupuesto", idPresupuesto);
                modificar.Parameters.AddWithValue("@idCliente", idCliente);
                modificar.Parameters.AddWithValue("@id", id);
                modificar.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un presupuesto asociado a un cliente
        /// </summary>
        /// <param name="id">Determina la relación a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deletePresupuestoCliente(int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "DELETE FROM presupuestos_clientes WHERE id = @id";
                eliminar.Parameters.AddWithValue("@id", id);
                eliminar.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los presupuestos y sus clientes
        /// </summary>
        /// <returns>Devuelve una tabla con todos los presupuestos</returns>
        public DataTable getAllPresupuestoCliente()
        {
            DataTable presupuestos_clientes = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();

            try
            {
                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT pr.id, p.tipo_presupuesto, p.codigo, p.fecha, p.estado, p.es_proforma, c.Nombre FROM presupuestos_clientes pr "
                                    + "INNER JOIN presupuestos p ON pr.id_presupuesto = p.id "
                                    + "INNER JOIN clientes c ON pr.id_cliente = c.id "
                                    + "WHERE c.Activo = true";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(presupuestos_clientes);
                
                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                presupuestos_clientes = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return presupuestos_clientes;
        }

        /// <summary>
        /// Obtiene un presupuesto y su cliente
        /// </summary>
        /// <param name="codigoPresupuesto">Determina el presupuesto a obtener</param>
        /// <returns>Devuelve un objeto presupuestoCliente</returns>
        public presupuestosClientes getPresupuestoCliente(string codigoPresupuesto)
        {
            presupuestosClientes pc = new presupuestosClientes();
            MySqlConnection conexion = Conexion.conexionMySQL();

            try
            {
                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT pr.id, p.tipo_presupuesto, p.codigo, p.fecha, p.precio, p.estado, c.Nombre FROM presupuestos_clientes pr "
                                    + "INNER JOIN presupuestos p ON pr.id_presupuesto = p.id "
                                    + "INNER JOIN clientes c ON pr.id_cliente = c.id "
                                    + "WHERE p.codigo = @codigo"; 
                consulta.Parameters.AddWithValue("@codigo", codigoPresupuesto);
                MySqlDataReader lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    pc.ID = Convert.ToInt16(lector["id"].ToString());
                    pc.CodigoPresupuesto = lector["codigo"].ToString();
                    pc.EstadoPresupuesto = lector["estado"].ToString();
                    pc.Fecha = Convert.ToDateTime(lector["fecha"].ToString());
                    pc.NombreCliente = lector["Nombre"].ToString();
                    pc.Precio = Convert.ToDouble(lector["precio"].ToString());
                    pc.TipoPresupuesto = lector["tipo_presupuesto"].ToString();
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                pc = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return pc;
        }
    }
}
